package Work0610;

import java.io.*;
import java.util.List;
import java.util.Scanner;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/**
 * 二： products.xml基本信息解释如下： product为商品信息节点，discount表示是否折扣，如果是折扣商品，打七折；
 * factoryaddr是工厂地址； itemno为商品编号，name为商品名称，price为商品单价，unit是计价单位，stockcount是库存量。
 * 1：读取products.xml中的商品信息，输出。 2：查找商品信息：根据输入的商品号，输出对应的商品信息。
 * 3：修改products.xml，输入商品编号（itemno）和数量，修改对应商品的数量（stockcount）；没有找到商品号，给出提示。
 * 
 * 4：以products.xml作为基础，实现客户购买的方法，输入商品号和购买数量，计算应付金额，如果是折扣商品，打七折；如果购买数量超过库存量，给出提示；商品不存在，给出提示；购买成功，扣除相应的数量。最后输出应付款的金额。
 * 
 * 5:增加新商品的功能，要求商品号和商品名称都不能重复（即不能和已经存在的重复）
 * 
 * @author Y
 *
 */
public class Products {

	public static final String path = "F:\\存放java的地方\\Homework\\src\\products.xml";

	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);

		System.out.println("1.读取商品信息2.查找商品信息3.根据编号修改数量4.购买商品5.增加商品");
		System.out.println("请输入选择:");
		int a = in.nextInt();
		if (a == 1) {
			read();
		}
		if (a == 2) {
			System.out.println("输入商品编号:");
			int num = in.nextInt();
			find(num);
		}
		if (a == 3) {
			System.out.println("输入商品的编号和修改后的数量:");
			int n = in.nextInt();
			int u = in.nextInt();
			modifystockcount(n, u);
		}
		if (a == 4) {
			System.out.println("输入商品的编号和购买的数量数量:");
			int n = in.nextInt();
			int u = in.nextInt();
			purchase(n, u);
		}
		if (a == 5) {
			System.out.println("请输入编号,姓名,是否打折(true或者false),地址,价格,库存,计量单位");
			int a1 = in.nextInt();
			String b = in.next();
			String c = in.next();
			String d = in.next();
			double e = in.nextInt();
			int f = in.nextInt();
			String j = in.next();
			addGoods(a1, b, c, d, e, f, j);
		}

	}

	/**
	 * 展示所有商品信息
	 */
	public static void read() {
		SAXReader reader = new SAXReader();
		Document dos = null;
		try {
			dos = reader.read(new File(path));
		} catch (DocumentException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			System.out.println("文件出错了");
		}

		List<Element> list = dos.selectNodes("shop/product");
		for (Element e : list) {
			Element na = (Element) e.selectSingleNode("name");
			System.out.println("商品名称为" + na.getText());
			Element num = (Element) e.selectSingleNode("itemno");
			System.out.println("编号为" + num.getText());
			Element money = (Element) e.selectSingleNode("price");
			System.out.println("价格为" + money.getText() + "元");
			Element un = (Element) e.selectSingleNode("unit");
			System.out.println("计量单位为" + un.getText());
			System.out.println("库存还剩下" + e.selectSingleNode("stockcount").getText());
			System.out.println("是否打折" + e.attributeValue("discount"));
			if (e.attributeValue("discount").equals("true")) {
				System.out.println("折扣为7折");
			}
			System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>");
		}
	}

	/**
	 * 根据编号查找信息
	 */
	public static void find(int num) {
		SAXReader reader = new SAXReader();
		Document dos = null;
		try {
			dos = reader.read(new File(path));
		} catch (DocumentException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			System.out.println("文件出错了");
		}

		List<Element> list = dos.selectNodes("shop/product");
		for (Element e : list) {
			Element nu = (Element) e.selectSingleNode("itemno");
			int a = Integer.parseInt(nu.getText());

			if (a == num) {
				System.out.println("商品名称为" + e.selectSingleNode("name").getText());
				System.out.println("编号为" + e.selectSingleNode("itemno").getText());
				System.out.println("价格为" + e.selectSingleNode("price").getText());
				System.out.println("计量单位为" + e.selectSingleNode("unit").getText());
				System.out.println("库存还剩下" + e.selectSingleNode("stockcount").getText());
				System.out.println("是否打折" + e.attributeValue("discount"));
				if (e.attributeValue("discount").equals("true")) {
					System.out.println("折扣为7折");
				}
				break;
			}
		}
	}

	/**
	 * 根据编号,修改数量
	 * 
	 * @param itemo
	 * @param stockcount
	 */
	public static void modifystockcount(int itemo, int stockcount) {
		SAXReader reader = new SAXReader();
		Document dos = null;
		try {
			dos = reader.read(new File(path));
		} catch (DocumentException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			System.out.println("文件出错了");
		}
		boolean q = false;
		List<Element> list = dos.selectNodes("shop/product");
		for (Element e : list) {
			Element nu = (Element) e.selectSingleNode("itemno");
			int a = Integer.parseInt(nu.getText());
			if (a == itemo) {
				e.selectSingleNode("stockcount").setText(String.valueOf(stockcount));
				q = true;
			}
		}
		if (q == false) {
			System.out.println("商品不存在!");
			return;
		}

		try {
			OutputFormat format = OutputFormat.createPrettyPrint();// 添加格式
			format.setEncoding("utf-8");
			XMLWriter xm = new XMLWriter(new FileOutputStream(path), format);
			xm.write(dos);
			xm.close();
			System.out.println("修改成功!");
		} catch (Exception e1) {
			// TODO 自动生成的 catch 块
			e1.printStackTrace();
		}

	}

	/**
	 * 4：以products.xml作为基础，实现客户购买的方法，输入商品号和购买数量，计算应付金额，如果是折扣商品，打七折；
	 * 如果购买数量超过库存量，给出提示；商品不存在，给出提示；购买成功，扣除相应的数量。最后输出应付款的金额。
	 * 
	 * @param itemno
	 * @param num
	 */
	public static void purchase(int itemno, int num) {
		SAXReader reader = new SAXReader();
		Document dos = null;
		try {
			dos = reader.read(new File(path));
		} catch (DocumentException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			System.out.println("文件出错了");
		}
		boolean q = false;
		List<Element> list = dos.selectNodes("shop/product");
		for (Element e : list) {
			Element nu = (Element) e.selectSingleNode("itemno");
			int a = Integer.parseInt(nu.getText());// 获得编号
			if (a == itemno) {
				Element en = (Element) e.selectSingleNode("stockcount");
				int ent = Integer.parseInt(en.getText());// 获得商品库存
				if (ent < num) {// 如果库存少于所需
					System.out.println("库存不够!");
					return;
				}
				int i = Integer.parseInt(e.selectSingleNode("price").getText());// 否则获得商品的价格
				en.setText(String.valueOf(a - num));// 更改商品的库存
				double money = 0;
				if (e.attributeValue("discount").equals("true")) {// 如果打折
					money = i * num * 0.7;// 计算所需金钱
				}
				System.out.println("所应支付" + money + "元");
				q = true;
			}
		}
		if (q == false) {
			System.out.println("商品不存在!");
			return;
		}
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();// 添加格式
			format.setEncoding("utf-8");
			XMLWriter xm = new XMLWriter(new FileOutputStream(path), format);
			xm.write(dos);
			xm.close();
			System.out.println("修改成功!");
		} catch (Exception e1) {
			// TODO 自动生成的 catch 块
			e1.printStackTrace();
		}
	}

	/**
	 * 5:增加新商品的功能，要求商品号和商品名称都不能重复（即不能和已经存在的重复）
	 */
	public static void addGoods(int itemno, String name, String q, String place, double money, int number, String o) {
		SAXReader reader = new SAXReader();
		Document dos = null;
		try {
			dos = reader.read(new File(path));
		} catch (DocumentException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
			System.out.println("文件出错了");
		}
		List<Element> list = dos.selectNodes("shop/product");
		for (Element e : list) {
			Element nu = (Element) e.selectSingleNode("itemno");
			int a = Integer.parseInt(nu.getText());// 获得编号
			if ((itemno == a) || e.selectSingleNode("name").getText().equals(name)) {
				System.out.println("编号重复或名字重复,请重新输入!");
				return;
			}
		}
		Element root = dos.getRootElement();
		Element p1 = root.addElement("product");// 增加一个商品节点
		p1.addAttribute("discount", q);// 添加属性discount
		p1.addAttribute("factoryaddr", place);// 添加属性factoryaddr
		Element p2 = p1.addElement("itemno");// 增加编号节点
		p2.setText(String.valueOf(itemno));
		Element p3 = p1.addElement("name");// 增加名称节点
		p3.setText(name);
		Element p4 = p1.addElement("price");// 增加价格节点
		p4.setText(String.valueOf(money));
		Element p5 = p1.addElement("stockcount");// 增加库存节点
		p5.setText(String.valueOf(number));
		Element p6 = p1.addElement("unit");// 增加计量单位节点
		p6.setText(o);
		try {
			OutputFormat format = OutputFormat.createPrettyPrint();// 添加格式
			format.setEncoding("utf-8");
			XMLWriter xm = new XMLWriter(new FileOutputStream(path), format);
			xm.write(dos);
			xm.close();
			System.out.println("修改成功!");
		} catch (Exception e1) {
			// TODO 自动生成的 catch 块
			e1.printStackTrace();
		}
	}
}
